/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package forense.frames;

import com.sun.media.sound.ModelOscillator;
import forense.dbo.ConexionBD;
import forense.entities.Archivos;
import java.io.File;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Pattern;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableRowSorter;

/**
 *
 * @author Kate
 */
public class Files extends javax.swing.JFrame {

    /**
     * Creates new form Case
     */
    public Files() {
        initComponents();
        this.setResizable(false);
        this.setLocationRelativeTo(null);

        txtCodCaso.setText(Inicio.txtCaso.getText());
        txtEvidencia.setText(Inicio.txtEvidencia.getText());
        txtDispositivo.setText(Inicio.txtDispositivo.getText());
        jTableArchivos.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        jTableArchivos.doLayout();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jLabel2 = new javax.swing.JLabel();
        jTextField2 = new javax.swing.JTextField();
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        txtCodCaso = new javax.swing.JTextField();
        jLabel6 = new javax.swing.JLabel();
        txtRuta = new javax.swing.JTextField();
        btnBuscarRutaFiles = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTableArchivos = new javax.swing.JTable();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        txtEvidencia = new javax.swing.JTextField();
        txtDispositivo = new javax.swing.JTextField();
        btnEliminarRepetido = new javax.swing.JButton();
        jLabel5 = new javax.swing.JLabel();
        jButton3 = new javax.swing.JButton();
        jButton5 = new javax.swing.JButton();

        jLabel2.setText("Fecha y hora de incautación:");

        jTextField2.setText("jTextField2");

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Subir archivos", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N

        jLabel1.setText("Código caso de estudio:");

        txtCodCaso.setEnabled(false);

        jLabel6.setText("Ruta archivos:");

        btnBuscarRutaFiles.setText("Buscar");
        btnBuscarRutaFiles.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnBuscarRutaFilesActionPerformed(evt);
            }
        });

        jTableArchivos.setAutoCreateRowSorter(true);
        jTableArchivos.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Id", "Caso", "Evidencia", "Dispositivo", "Nombre archivo", "Ruta"
            }
        ));
        jTableArchivos.setColumnSelectionAllowed(true);
        jScrollPane2.setViewportView(jTableArchivos);
        jTableArchivos.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        if (jTableArchivos.getColumnModel().getColumnCount() > 0) {
            jTableArchivos.getColumnModel().getColumn(0).setMinWidth(200);
            jTableArchivos.getColumnModel().getColumn(0).setPreferredWidth(200);
            jTableArchivos.getColumnModel().getColumn(0).setMaxWidth(200);
            jTableArchivos.getColumnModel().getColumn(1).setMinWidth(50);
            jTableArchivos.getColumnModel().getColumn(1).setPreferredWidth(50);
            jTableArchivos.getColumnModel().getColumn(1).setMaxWidth(50);
            jTableArchivos.getColumnModel().getColumn(2).setMinWidth(100);
            jTableArchivos.getColumnModel().getColumn(2).setPreferredWidth(100);
            jTableArchivos.getColumnModel().getColumn(2).setMaxWidth(100);
            jTableArchivos.getColumnModel().getColumn(3).setMinWidth(50);
            jTableArchivos.getColumnModel().getColumn(3).setPreferredWidth(50);
            jTableArchivos.getColumnModel().getColumn(3).setMaxWidth(50);
            jTableArchivos.getColumnModel().getColumn(4).setMinWidth(200);
            jTableArchivos.getColumnModel().getColumn(4).setPreferredWidth(200);
            jTableArchivos.getColumnModel().getColumn(4).setMaxWidth(200);
            jTableArchivos.getColumnModel().getColumn(5).setMinWidth(600);
            jTableArchivos.getColumnModel().getColumn(5).setPreferredWidth(600);
            jTableArchivos.getColumnModel().getColumn(5).setMaxWidth(600);
        }

        jLabel3.setText("Evidencia:");

        jLabel4.setText("Dispositivo:");

        btnEliminarRepetido.setText("Eliminar");
        btnEliminarRepetido.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnEliminarRepetidoActionPerformed(evt);
            }
        });

        jLabel5.setIcon(new javax.swing.ImageIcon(getClass().getResource("/forense/images/Warning.png"))); // NOI18N
        jLabel5.setText("No se olvide de eliminar los archivos repetidos!");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addGap(0, 0, Short.MAX_VALUE)
                .addComponent(jLabel5)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnEliminarRepetido)
                .addGap(42, 42, 42))
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(21, 21, 21)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(jLabel3)
                            .addComponent(jLabel1)
                            .addComponent(jLabel4)))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(62, 62, 62)
                        .addComponent(jLabel6)))
                .addGap(18, 18, 18)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addComponent(txtDispositivo, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 111, Short.MAX_VALUE)
                        .addComponent(txtEvidencia))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(txtRuta, javax.swing.GroupLayout.PREFERRED_SIZE, 290, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(btnBuscarRutaFiles))
                    .addComponent(txtCodCaso, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(48, Short.MAX_VALUE))
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane2)
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(txtCodCaso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(txtEvidencia, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel4)
                    .addComponent(txtDispositivo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtRuta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel6)
                    .addComponent(btnBuscarRutaFiles))
                .addGap(18, 18, 18)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnEliminarRepetido)
                    .addComponent(jLabel5))
                .addGap(22, 22, 22)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 175, Short.MAX_VALUE))
        );

        jButton3.setText("Cancelar");
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });

        jButton5.setText("Finalizar");
        jButton5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton5ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE)
                        .addComponent(jButton3)
                        .addGap(2, 2, 2)
                        .addComponent(jButton5)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton3)
                    .addComponent(jButton5))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void btnBuscarRutaFilesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnBuscarRutaFilesActionPerformed
        String archivo;
        String ruta;

        JFileChooser fc = new JFileChooser();
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int res = fc.showOpenDialog(fc);
        if (res == JFileChooser.APPROVE_OPTION) {
            File archFile = fc.getSelectedFile();
            //obtengo ruta
            ruta = archFile.getAbsolutePath();
            txtRuta.setText(ruta);
            String[] ficheros = archFile.list();
            if (ficheros == null) {
                System.out.println("No hay ficheros en el directorio");
            } else {
                for (int i = 0; i < ficheros.length; i++) {
                    //System.out.println(ficheros[i]);
                }
            }
            String[] buscar = {"localappstate.db", "packages.xml", "icingcorpora.db", "dmappmgr.db", "browser2.db", "sisodownloads.db"};
            for (int i = 0; i < buscar.length; i++) {
                System.out.println(buscar[i]);
                LinkedList<File> ficherosJava = new LinkedList<File>();
                dameFicheros(ruta, dameRegex("*" + buscar[i]), ficherosJava, true);
                for (int j = 0; j < ficherosJava.size(); j++) {
                    String dato = ficherosJava.get(j).getAbsolutePath();
                    String reemplazar = dato.replace("\\","/");
                    String name = ficherosJava.get(j).getName();
                    System.out.println("--> " + ficherosJava.get(j).getAbsolutePath());
                    System.out.println("--> " + name);
                    //añadir a la tabla
                    String codC = txtCodCaso.getText();
                    String evi = txtEvidencia.getText();
                    String dispositivo = txtDispositivo.getText();

                    String id = codC + "-" + evi + "-" + dispositivo + "-" + i;

//
                    DefaultTableModel modelo = (DefaultTableModel) jTableArchivos.getModel();
                    TableRowSorter sorter = new TableRowSorter(modelo);
                    jTableArchivos.setRowSorter(sorter);
                    jTableArchivos.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                    jTableArchivos.doLayout();

                    Object[] datos = new Object[6];
                    datos[0] = id;
                    datos[1] = codC;
                    datos[2] = evi;
                    datos[3] = dispositivo;
                    datos[4] = name;
                    datos[5] = reemplazar;

                    modelo.addRow(datos);
                    ///////////////
                }

            }

            ////////////+
//            LinkedList<File> ficherosJava = new LinkedList<File>();
//            dameFicheros(ruta, dameRegex("*localappstate.db"), ficherosJava, true);
//            for (int i = 0; i < ficherosJava.size(); i++) {
//                System.out.println("--> "+ficherosJava.get(i).getAbsolutePath());
//            }
            ///////////+
        } else {
            JOptionPane.showMessageDialog(rootPane, "Debe seleccionar un directorio");
        }
    }//GEN-LAST:event_btnBuscarRutaFilesActionPerformed

    private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton5ActionPerformed
        // TODO add your handling code here:
        //for (int i = 0; i < jTableArchivos.getRowCount(); i++) {
            guardarFiles();
        //}

        JOptionPane.showMessageDialog(null, "Datos guardados con exito");
        dispose();
    }//GEN-LAST:event_jButton5ActionPerformed

    private void btnEliminarRepetidoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnEliminarRepetidoActionPerformed
        DefaultTableModel modelo = (DefaultTableModel) jTableArchivos.getModel();
        int a = jTableArchivos.getSelectedRow();
        if (a < 0) {
            JOptionPane.showMessageDialog(null, "Debe seleccionar una fila de la tabla");
        } else {
            int confirmar = JOptionPane.showConfirmDialog(null, "¿Esta seguro de eliminar el registro?");
            if (JOptionPane.OK_OPTION == confirmar) {
                modelo.removeRow(a);
                //JOptionPane.showMessageDialog(null, "Registro eliminado");
            }
        }
    }//GEN-LAST:event_btnEliminarRepetidoActionPerformed

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed
        dispose();
    }//GEN-LAST:event_jButton3ActionPerformed
    public void imprimir(String x) {
        System.out.println("--> " + x);
    }

    public void dameFicheros(String pathInicial, String mascara, LinkedList<File> listarFicheros, boolean busquedaRecursiva) {
        File directorioInicial = new File(pathInicial);
        if (directorioInicial.isDirectory()) {
            File[] ficheros = directorioInicial.listFiles();
            for (int i = 0; i < ficheros.length; i++) {
                if (ficheros[i].isDirectory() && busquedaRecursiva) {
                    dameFicheros(ficheros[i].getAbsolutePath(), mascara, listarFicheros, busquedaRecursiva);
                } else if (Pattern.matches(mascara, ficheros[i].getName())) {
                    listarFicheros.add(ficheros[i]);
                }
            }
        }
    }

    public String dameRegex(String mascara) {
        mascara = mascara.replace(".", "\\.");
        mascara = mascara.replace("*", ".*");
        mascara = mascara.replace("?", ".");
        return mascara;
    }

    public void guardarFiles() {
        ConexionBD con = new ConexionBD();

        int fila = jTableArchivos.getRowCount();
        int col = jTableArchivos.getColumnCount();
        Archivos files;
        String id;
        String caso;
        String evidencia;
        String dispositivos;
        String nombre;
        String ruta;
        for (int i = 0; i < fila; i++) {
            id = jTableArchivos.getValueAt(i, 0).toString();
            caso = jTableArchivos.getValueAt(i, 1).toString();
            evidencia = jTableArchivos.getValueAt(i, 2).toString();
            dispositivos = jTableArchivos.getValueAt(i, 3).toString();
            nombre = jTableArchivos.getValueAt(i, 4).toString();
            ruta = jTableArchivos.getValueAt(i, 5).toString();
            //files = new Archivos(id, caso, evidencia, dispositivos, nombre, ruta);
            files = new Archivos(jTableArchivos.getValueAt(i, 0).toString(), 
                    jTableArchivos.getValueAt(i, 1).toString(), 
                    jTableArchivos.getValueAt(i, 2).toString(), 
                    jTableArchivos.getValueAt(i, 3).toString(), 
                    jTableArchivos.getValueAt(i, 4).toString(), 
                    jTableArchivos.getValueAt(i, 5).toString());
            if (con.guardarArchivos(files, jTableArchivos.getValueAt(i, 0).toString())) {
                //JOptionPane.showMessageDialog(null, "Datos guardados con exito");
                //break;
                //      dispose();
            } else {
                JOptionPane.showMessageDialog(null, "Error al guardar los datos");
            }

        }
        //dispose();

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Files.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Files.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Files.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Files.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Files().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnBuscarRutaFiles;
    private javax.swing.JButton btnEliminarRepetido;
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton5;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTable jTableArchivos;
    private javax.swing.JTextField jTextField2;
    public static javax.swing.JTextField txtCodCaso;
    private javax.swing.JTextField txtDispositivo;
    private javax.swing.JTextField txtEvidencia;
    private javax.swing.JTextField txtRuta;
    // End of variables declaration//GEN-END:variables
}
